// 1、导入系统模块

// 2、导入自定义模块
// 2.1 导入jwt模块
const jwt = require('jsonwebtoken')
// 2.2 导入系统配置
const {JWT_SECRET} = require('../config/config.default')
// 2.3导入错误类型常量
const {
    tokenExpiredError,
    invalidtoken,
    hasNotAdminPermission
}=require('../constant/error.type')

// 3、定义中间件
// 3.1 验证用户登录
const auth = async (ctx, next) => {
    const {authorization = ''} = ctx.request.header
    const token = authorization.replace('Bearer ', '')
    try {
        //包含payload信息，id、user_name、is_admin
        ctx.state.user=jwt.verify(token, JWT_SECRET)
    } catch (error) {
        switch (error.name){
            case 'TokenExpiredError':
                console.error('token已过期', error)
                return ctx.app.emit('error',tokenExpiredError,ctx)
            case 'JsonWebTokenError':
                console.error('无效token', error)
                return ctx.app.emit('error',invalidtoken,ctx)

        }
    }
    await next()
}
// 3.2查询授权
const hasAdminPermission=async (ctx,next)=>{
    const {is_admin} =ctx.state.user
    if(!is_admin){
        console.error('用户没有管理员权限',ctx.state.user)
        return ctx.app.emit('error',hasNotAdminPermission,ctx)
    }
    await next()
}
// 4、导出中间件函数
module.exports = {
    auth,
    hasAdminPermission,
}